package com.chf.items;

import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.item.Tiers;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import org.jetbrains.annotations.NotNull;

import java.util.List;
import java.util.Random;

/**
 * 下界合金剑
 *
 * @author niooooo
 */
public class ObsidianSword extends SwordItem {

    /**
     * 创建一个剑
     *
     * @param attackDamage 武器伤害 --> 最终伤害 = 基础伤害 + 物品材质伤害 + 武器伤害。基础伤害为1.0
     * @param attackSpeed 攻击速度 --> 最终攻速 = 基础攻速 + 武器攻速。基础攻速为4.0
     * @param properties 属性 --> 物品的最大堆叠栈(数量),物品的最大耐久值,物品的所在创造物品栏位置等等
     */
    public ObsidianSword(int attackDamage, float attackSpeed, Properties properties) {
        super(Tiers.NETHERITE, attackDamage, attackSpeed, properties);
    }

    /**
     * 玩家右键点击时触发（获取玩家身边的生物进行处决）
     *
     * @param level  {@link Level} 世界
     * @param player {@link Player} 玩家
     * @param hand   {@link InteractionHand} 交互手
     * @return {@link InteractionResultHolder}
     */
    @Override
    public @NotNull InteractionResultHolder<ItemStack> use(@NotNull Level level,
                                                           @NotNull Player player,
                                                           @NotNull InteractionHand hand) {
        ItemStack stack = player.getItemInHand(hand);

        // 只在服务器端执行
        //if (!level.isClientSide()) {
        // TODO 测试
        if (true) {
            // X轴方向5.5格（左右各5.5格，共11格）
            double rangeX = 5.5;
            // Y轴方向3.5格（上下各3.5格，共7格）
            double rangeY = 3.5;
            // Z轴方向5.5格（前后各5.5格，共11格）
            double rangeZ = 5.5;

            // 获取玩家位置
            double playerX = player.getX();
            // 从眼睛高度开始计算
            double playerY = player.getY() + player.getEyeHeight();
            double playerZ = player.getZ();

            // 创建搜索区域（AABB）11x7x11
            AABB searchArea = new AABB(
                    playerX - rangeX, playerY - rangeY, playerZ - rangeZ,
                    playerX + rangeX, playerY + rangeY, playerZ + rangeZ
            );

            // 获取区域内所有活着的非玩家生物
            List<LivingEntity> entities = level.getEntitiesOfClass(
                    LivingEntity.class,
                    searchArea,
                    // 排除玩家自身
                    e -> e.isAlive() && !(e instanceof Player)
            );

            // 如果有生物存在
            if (!entities.isEmpty()) {
                // 随机选择一个生物
                LivingEntity target = entities.get(new Random().nextInt(entities.size()));

                // 在 1.20.1 中创建特殊伤害源（不掉落经验值）
                // 使用 OUT_OF_WORLD 伤害类型，它天生无视所有保护机制
                DamageSource instantKill = player.damageSources().fellOutOfWorld();

                // 直接杀死生物（不掉落经验）造成极大伤害确保秒杀
                target.hurt(instantKill, Float.MAX_VALUE);

                // 播放处决音效
                level.playSound(null, target.getX(), target.getY(), target.getZ(),
                        SoundEvents.PLAYER_ATTACK_CRIT, SoundSource.PLAYERS, 1.0F, 1.0F);

                // 设置玩家冷却时间（防止连续使用）
                player.getCooldowns().addCooldown(this, 20);

                // 消耗耐久度
                stack.hurtAndBreak(1, player, (p) -> p.broadcastBreakEvent(hand));

                // 添加粒子效果
                level.explode(player, target.getX(), target.getY(), target.getZ(),
                        0.5F, false, Level.ExplosionInteraction.NONE);
            }
        }

        // 播放使用动画
        player.swing(hand);
        return InteractionResultHolder.sidedSuccess(stack, level.isClientSide());
    }
}
